/*  
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica.cliente;

import java.io.*;

import java.net.MalformedURLException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author abel
 */
public class Cliente {
    
   
   

    public Cliente() {
        
    }
    
  /*  public String aplicarmetodograndulon() 
    {
        String miIp;
        int cont=0;
        File f = new File( "src/Archivos/Cliente/ipclientes.txt" );
        BufferedReader entrada;
        try {
            entrada = new BufferedReader( new FileReader( f ) );
            String linea;
        //lee las ip de los clientes para reenviar el mensaje
        String direccion = InetAddress.getLocalHost().getHostAddress();
        while(entrada.ready()){
        linea = entrada.readLine();
       
        System.out.println(linea);
        try{
            if (esmayor(direccion,linea)){
            ClienteRMIinterface e= (ClienteRMIinterface) Naming.lookup("rmi://"+linea+":1099/info");
            e.estasactivo();
            cont++;}
        }catch (Exception e) 
        {
            e.printStackTrace();
        }}
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    
         if (cont==0){return "si";}else{return "no";}
       
        
        
       
    } */
    //verifico si la ip del cliente es menor a la de los demas clientes
    public boolean esmayor(String dir1,String dir2)
    {
      int numero1=0;
      int numero2=0;
      int contadormayor=0;
      boolean mayor=false;
      //obtengo los numeors de las ip para comparar
      StringTokenizer direcc1 = new StringTokenizer(dir1,"."); 
      StringTokenizer direcc2 = new StringTokenizer(dir2,".");
      while (direcc1.hasMoreTokens()){
            numero1 = Integer.parseInt(direcc1.nextToken());
            numero2 = Integer.parseInt(direcc2.nextToken());
            //comparo si la direccion 2 es mayor que la 1
            if (numero2>numero1)
            {
                //si encuantra que si es mayo suma al contador
                contadormayor++;
            }
            System.out.println (direcc1.nextToken());
      }
      
      if(contadormayor>0)
      {
      mayor=true;
      }
      return mayor;
    }
    //Le aviso a los demas clientes que usen el servidor de respaldo
   public void usarservidorderespaldo() 
   {
        try {
            File f = new File( "src/Archivos/Cliente/ipclientes.txt" );
             BufferedReader entrada;
             
             entrada = new BufferedReader( new FileReader( f ) );
             String linea;
             try {
                 //lee las ip de los clientes para reenviar el mensaje
                 while(entrada.ready()){
                 linea = entrada.readLine();
                 System.out.println(linea);
             
                 
                     
                     ClienteRMIinterface e;
                    try {
                        e = (ClienteRMIinterface) Naming.lookup("rmi://"+linea+":1099/info");
                        e.usarservidorderespaldo();
                    } catch (NotBoundException ex) {
                        Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (MalformedURLException ex) {
                        Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (RemoteException ex) {
                        Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    }
                     }
             } catch (IOException ex) {
                 Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
             }
             } catch (FileNotFoundException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
        
   //me da la ip del servidor principal 
   public String obteneripservidorprincipal()
   {
      File f = new File( "src/Archivos/Cliente/ipservidorprincipal.txt" );
        BufferedReader entrada;
        String linea="";
        try {
            entrada = new BufferedReader( new FileReader( f ) );
                    //lee las ip de los clientes para reenviar el mensaje
        
        while(entrada.ready()){
        linea = entrada.readLine();
        
        }
        
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("Servidor Principal : "+linea);
        return linea;
   }
   
   public void entraraunasala(Usuario usuario)
   {
        try{
            ClienteRMIinterface e= (ClienteRMIinterface) Naming.lookup("rmi://"+obteneripservidorprincipal()+":1099/info");
            System.out.println("ClienteEntraraunasala Usuario : "+usuario.getDireccionIP()+" "+usuario.getSala());
            e.entraraunasala(usuario);
            e.mostrarmensajermiguardados(usuario);
            e.llenarsalaservidor(usuario);
        }catch (Exception e) 
        {
             try {
                usarservidorderespaldo() ;
                entraraunasala(usuario);
            } catch (Exception ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            } 
            
            e.printStackTrace();
        }
       
   }
   
   public void salirdesala(Usuario usuario)
   {
       try{
            ClienteRMIinterface e= (ClienteRMIinterface) Naming.lookup("rmi://"+obteneripservidorprincipal()+":1099/info");
            e.salirdeunasala(usuario);
            e.llenarsalaservidor(usuario);
        }catch (Exception e) 
        {
            try {
                usarservidorderespaldo() ;
                salirdesala(usuario);
            } catch (Exception ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            } 
            e.printStackTrace();
        }
       
   }
   
   public void borrarinfodepantalla(Usuario usuario)
   {
       try{
            ClienteRMIinterface e= (ClienteRMIinterface) Naming.lookup("rmi://"+usuario.getDireccionIP()+":1099/info");
            e.borrardatosinterfaz();
        }catch (Exception e) 
        {
            try {
                usarservidorderespaldo() ;
                salirdesala(usuario);
            } catch (Exception ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            } 
            e.printStackTrace();
        }
       
   }
     
     public synchronized void EnviarMensaje(Usuario usuario) 
    {
        try{
            ClienteRMIinterface e= (ClienteRMIinterface) Naming.lookup("rmi://"+obteneripservidorprincipal()+":1099/info");
            e.escribirmensaje(usuario);
        }catch (Exception e) 
        {
            try {
                usarservidorderespaldo() ;
                EnviarMensaje(usuario);
            } catch (Exception ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            } 
            e.printStackTrace();
        }
         /*try {
            //InetAddress direccion;
            
            InetAddress direccion = InetAddress.getLocalHost(); //direccion local
            //InetAddress direccion = InetAddress.getByName("192.168.1.204");
            servidor = new Socket(direccion,usuario.getPuerto());
            
            salida = new ObjectOutputStream(servidor.getOutputStream());
            salida.flush();
            try{
                
            salida.writeObject(usuario);
            salida.flush();
            
            }catch ( InvalidClassException  excepcion ) {
        System.out.println("error al escribir el objeto");
      }
            
                      
            

        } catch (IOException ex) {
             System.out.println("error al escribir el objeto");
           
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }*/
    }
   
     
    public void enviarmensajeglobal(Usuario usuario)
    {
         try {
               System.out.println("Enviando Mensaje Global");
                File f = new File( "src/Archivos/Cliente/ipclientes.txt" );
                BufferedReader entrada;
                entrada = new BufferedReader( new FileReader( f ) );
                String linea;
                System.out.println("mostra mensajes :");
                try {
                    //lee las ip de los clientes para reenviar el mensaje
                    while(entrada.ready()){
                    linea = entrada.readLine();
                    System.out.println(linea);
                    
                        
                        ClienteRMIinterface e;
                        
                    try {
                        e = (ClienteRMIinterface) Naming.lookup("rmi://"+linea+":1099/info");
                        e.mostramensajermi(usuario);
                    } catch (NotBoundException ex) {
                        System.out.println("NotBoundException");
                    } catch (MalformedURLException ex) {
                        System.out.println("MalformedURLException");
                    } catch (RemoteException ex) {
                        System.out.println("RemoteException");
                    }
                        
                    }
                } catch (IOException ex) {
                    //Logger.getLogger(guardararchivo.class.getName()).log(Level.SEVERE, null, ex);
                }

            
        } catch (FileNotFoundException ex) {
           // Logger.getLogger(guardararchivo.class.getName()).log(Level.SEVERE, null, ex);
        } 
        
        
    }
     
    
    
    
}
